"""
#!/usr/bin/python3
# coding:utf-8            
#
# Copyright (C) 2024 - 2024 Jasonakeke， Inc. All Rights Reserved 
# @Desc	   ：
# @Time    : 2024/11/4 22:17
# @Author  : Code_By_Jasonakeke
# @Email   : 2284037977@qq.com
# @File    : logging.py
# @IDE     : PyCharm
"""
from logging import Formatter, handlers, getLogger, StreamHandler
from os import mkdir
from os.path import join, isdir

from flask import request


class RequestShoppingFormatter(Formatter):
	"""
	自定义日志输出格式
	"""

	def format(self, record):
		# 需要在日志中记录请求地址
		record.url = request.url
		# 需要在日志中记录客户端的地址
		record.remote_addr = request.remote_addr
		return super().format(record)


# 创建一个个性化的 logger 对象
def create_logger(app):
	"""
	设置日志配置
	:param app:
	:return:
	"""
	# 日志文件所在目录路径
	logging_file_dir = app.config['LOGGING_FILE_DIR']
	# 保留备份的日志文件个数
	logging_file_backup = app.config['LOGGING_FILE_BACKUP']
	# 日志文件最大大小，单位是字节
	logging_file_max_bytes = app.config['LOGGING_FILE_MAX_BYTES']
	# 默认的日志级别
	logging_level = app.config['LOGGING_LEVEL']

	# 设置日志输出格式（文件）
	requset_formatter = RequestShoppingFormatter(
		'[%(asctime)s] %(remote_addr)s 请求 %(url)s \t %(levelname)s 在 %(module)s %(lineno)s : %(message)s')

	# 检查如果目录不存在则创建目录
	if isdir(logging_file_dir):
		pass
	else:
		mkdir(logging_file_dir)

	# 自定义一个目录和日志文件
	flask_file_handler = handlers.RotatingFileHandler(filename = join(logging_file_dir, 'shopping.log'),
	                                                  maxBytes = logging_file_max_bytes,
	                                                  backupCount = logging_file_backup)

	# 给当前的结果 handler 设置格式
	flask_file_handler.setFormatter(requset_formatter)
	# 得到一个 logger 对象
	flask_logger = getLogger('Shopping')
	flask_logger.addHandler(flask_file_handler)
	flask_logger.setLevel(logging_level)

	# 整个项目需要两个 handler 对象，一个是文件，一个是控制台
	flask_console_handler = StreamHandler()
	flask_console_handler.setFormatter(Formatter('[%(asctime)s] %(remote_addr)s 请求 %(url)s \t %(levelname)s 在 %(module)s %(lineno)s : %(message)s'))

	if app.debug:
		flask_logger.addHandler(flask_console_handler)

	return flask_logger
